﻿#ifndef WORK_TCP_H
#define WORK_TCP_H

#include <QObject>
#include <QTcpSocket>
#include <QTimer>
#include "ui_seach.h"
#include "tool_xml.h"
#include "cluster.h"

typedef enum CmdType
{
    CMD_LOAD = 0x21,
    CMD_HB,

    CMD_SET_CLUSTER = 0x80, // 设置簇控制器
    CMD_GET_CLUSTER,        // 读取簇控制器
    CMD_GET_LOCAL,          // 设置就地控制器
    CMD_SET_LOCAL,          // 读取就地控制器
    CMD_SET_MOTOR,          // 设置电机状态
    CMD_REBOOT_LOCAL,       // 重启 重置 就地控制器
    CMD_GET_CMD,            // 获取就地CMD
    CMD_SET_CMD,            // 设置就地CMD
    CMD_GET_DNS,            // 获取就地DNA
    CMD_SET_DNS,            // 设置就地DNA
    CMD_MOTOR_REFR,         // 只读 更新电机状态
}CmdType_e;

typedef struct ClusterInfo_s
{
    QString fwVer;
    QString runTime;
    QString desc;
}ClusterInfo_t;

class WorkTcp : public QObject
{
    Q_OBJECT
public:
    WorkTcp(udpDeviceInfo_t cluster, QObject *parent = 0);
    ~WorkTcp();

    void getClusterInfo();

    Cluster *getC() const;

signals:
    void clusterConnected(QString);
    void clusterDisconnected(void);
    void getClusterSuccess(Cluster *);
    void getLocalSuccess(LocalDev *);
    void getCmdSuccess(LocalDev *);
    void getDnaSuccess(LocalDev *);
    void motorRefrSuccess(LocalDev *);

    void sendRetError(int);
    void msgbox(QString, QString, int, int = 0);

    void recvLoad(QString);
    void recvHeartbeat(QString);
    void recvGetCluster(QString);
    void recvSetCluster(QString);
    void recvGetLocal(QString);
    void recvSetLocal(QString);
    void recvSetMotor(QString);
    void recvGetCmd(QString);
    void recvSetCmd(QString);
    void recvGetDns(QString);
    void recvSetDns(QString);
    void recvRebootLocal(QString);
    void recvMotorRefr(QString);
    void startHeartbeat();

public slots:
    void connectToCluster(void);
    void sendLoadToCluster(void);
    void tcpRecvData(void);
    void sendHeartbeat();
    void sendGetLocal(int ldIndex);
    void sendClusterReboot(QString sn, int busId, QString maddr, int cmdType);
    void sendSetLocal(QString xml);
    void sendSetCluster(QString xml);
    void sendSetCmd(QString xml);
    void sendSetDna(QString xml);
    void sendGetCmd(QString xml);
    void sendGetDna(QString xml);

    void loadHandle(QString xml);
    void hbHandle(QString xml);
    void getClusterHandle(QString xml);
    void getLocalHandle(QString xml);
    void setLocalHandle(QString xml);
    void setCmdHandle(QString xml);
    void setDnsHandle(QString xml);
    void getCmdHandle(QString xml);
    void getDnaHandle(QString xml);
    void setClusterHandle(QString xml);
    void setMotor(QString xml);
    void setMotorHandle(QString xml);
    void rebootLocalHandle(QString xml);
    void refrMotorHandle(QString xml);

private:
    QByteArray dataPackage(QString xml, quint8 cmd);
    int dataUnpack(QByteArray package);

    QTcpSocket * m_tcp   = nullptr; // tcp socket句柄
    QTimer     * m_timer = nullptr; // 定时器句柄

    QString m_xBuf;                 // xml缓冲区
    udpDeviceInfo_t m_cluster;      // 要连接的簇控制器
    ClusterInfo_t m_clusterInfo;    // 簇控制器的详细信息
    Cluster * m_c; // 簇控制器
    int m_ldIndex; // 就地控制器
    ToolXml * m_xml;                // xml工具类
    quint16 m_serial = 0;           // tcp消息流水号
    bool m_tcpEnable = false;       // 完成簇控制器的登录

};

#endif // WORK_TCP_H
